package cc.ailley.proxy.dynamic.custom;

import cc.ailley.proxy.IUserDao;

import java.lang.reflect.Method;

/**
 * 自定义JDK动态代理
 *
 * 原理：字节码重组过程
 * 1、拿到被代理对象的引用，通过反射获取代理对象的所有接口
 * 2、通过JDK Proxy类生成一个新的类、同时新的类要实现代理对象的所有的接口
 * 3、动态生成Java代码，把新加的业务逻辑方法由一定的逻辑代码去调用(在代码中体现)
 * 4、编译新生成的Java代码.class文件
 * 5、在重新加载到JVM中
 *
 * @author ailley
 */
public class CustomProxyFactory implements CustomInvocationHandler {

    private IUserDao target;

    CustomProxyFactory(IUserDao target) {
        this.target = target;
    }

    public Object getInstance(IUserDao target) {
        return CustomProxy.newProxyInstance(new CustomClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.println("开启事务");
        Object o = null;
        try {
            o = method.invoke(target, args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("结束事务");
        return o;
    }
}
